-- Funções auxilizares utilizadas por vários arquivos, ou não

module Auxiliares
(
	makeError,
	valVarAux,
	makeVar,
	makeConstExp
) where

import Types


-- Gera uma string com uma mensagem de erro formatada
-- Linha, Causa/Descrição do erro
makeError :: Int -> String -> String
makeError line msg = "Um erro foi encontrado na linha número " ++ (show line) ++ " [> " ++ msg ++ " <]"

-- Constroi as variáveis
-- Nome, Tipo/Valor, Escopo
makeVar :: String -> Token -> Escopo -> Var
makeVar nome tipo escopo =
	case tipo of
		Integer_tk a -> (nome, [Integer_tk a], escopo)
		Character_tk a -> (nome, [Character_tk a], escopo)
		String_tk n a -> (nome, [String_tk n a], escopo)
		Logical_tk a -> (nome, [Logical_tk a], escopo)
		Real_tk a -> (nome, [Real_tk a], escopo)
		
-- Cria uma variável de tipo definido pelo usuário
-- Nome, nome do tipo, escopo, tipos definidos
makeVarUser :: String -> String -> Escopo -> UserTypesD -> Var
makeVarUser nome tipo escopo table =
	let (f, s) = getTypeComp tipo table escopo in
	if f then
		(nome, s, escopo)
	else
		()

-- Cria um tipo array
-- Nome, Tamanho, Tipo, Escopo
makeArray :: String -> Int -> Token -> Escopo -> Array
makeArray nome n tipo esc =
	let x = makeArrayElements nome n 0 in
	(nome, x, n, esc)
	
-- Gera lista de elementos do array
-- Nome, Tamanho, Posição atual, Tipo
makeArrayElements :: String -> Int -> Int -> [(Int, String)]
makeArrayElements nome n pos = (pos, (nome ++ "." ++ (show pos))):(makeArrayElements nome n (pos+1))


-- Nome, Tipo/Valor
makeVarUser :: String -> [Token] -> Escopo -> Var
makeVarUser nome tipo escopo = (nome, tipo, escopo)

-- Retorna uma expressão de constante
-- Nome da constante
makeConstExp :: String -> Expression
makeExp str = Const str

-- Retorna uma expressão de variável
-- Nome da variável
makeVarExp :: String -> Expression
makeVarExp str = Variavel str

-- Retorna uma expressão de valor
-- Tipo/valor
makeValExp :: Token -> Expression
makeValExp tval = Valor Token

makeAtribuicaoExp :: String -> Expression -> Expression
makeAtribuicaoExp nome exp = Atribuicao nome exp
